package com.weactivity.controller;


import com.weactivity.dto.*;
import com.weactivity.entity.Activity;
import com.weactivity.entity.Resource;
import com.weactivity.exception.ActivityCreationException;
import com.weactivity.service.ActivityService;
import com.weactivity.service.ResourceService;
import com.weactivity.service.UserService;
import com.weactivity.utils.ConvertUtil;
import com.weactivity.utils.UserHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.bind.annotation.*;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

@RestController
@RequestMapping("/api/act")
public class ActivityController {

    @Autowired
    private ActivityService activityService;
    @Autowired
    private ResourceService resourceService;
    @Autowired
    private UserService userService;

//    @Autowired
//    private TransactionTemplate transactionTemplate;
//
//    @Autowired
//    private PlatformTransactionManager transactionManager;


    //创建活动
    //todo 代码重构 因为业务逻辑写在controller层了
    @PostMapping("/new")
    public Result newActivity(@RequestBody ActivityCreateInfo activityCreateInfo) throws ActivityCreationException {

        //综合考虑ARP  Activity Resource Participant 进行活动的创建
        return activityService.createActByARP(activityCreateInfo);

    }

    /**
     *
     * 展示活动
     * 展示当前用户的所有活动
     * 2024.5.23
     * 目前先考虑展示所有的活动
     * 对活动进行一致的展示
     *
     * 之后考虑对于过期的活动，参加了的活动进行差异化
     * 马上要进行的活动进行重点化
     * //todo
     *
     * 2024.5.28 修改
     * 对activity表新增状态字段 a_stage int ; 0 表示未开始 1 表示正在进行 2 表示已结束
     * 在数据库中添加了事件， 每过30s更新活动的状态
     */

    @GetMapping ("/show")
    public Result showAllAct(){

        List<ActivitySimpleDTO> activityDTOList = activityService.showSimpleAll();
        if (null == activityDTOList){
            return Result.fail("activityDTOList为空");
        }

        if(0 == activityDTOList.size()){
            return Result.ok("目前暂无活动");
        }

        return Result.ok(activityDTOList);

    }

    /**
     * 查询用户所有的活动，包括过期和未过期活动
     * @return
     */
    @GetMapping("/showdetails")
    public Result showDetailAct(){
        //查询用户名下所有的Activity
       List<Activity> activityList = activityService.selectAllActivity();

        return Result.ok( activityList, (long) activityList.size());
    }

    /**
     * 用户确认参加活动的接口
     * 首先是活动创建者发送消息，接收消息的界面上显示是否参加活动还是拒绝活动
     * 这个接口就是参加活动的接口
     * 当用户点击该接口时，我们需要根据用户当前已有的活动判断用户是否能够参加活动
     * 如果接收活动的开始时间和结束时间都与用户已有的活动时间不冲突，则用户意愿参加，用户时间条件允许，判断用户可以参加活动
     * 如果用户存在时间冲突的活动，则返回提示“您该时间段已有其他活动”
     *
     * @return
     */

    @PostMapping("/ackJoin")
    public Result ackJoinActivity(@RequestParam("activityId") int activityId){
        //前端需要传这个activity的id
        //怎么传？
        //查询用户当前的所有的未开始和进行中活动，过滤掉已过期活动，定义未开始活动与进行中活动为
        List<Activity> validActivityList =  activityService.selectValidActivity();
        //得到用户id下所有的活动信息，要是用户已经参加了该活动怎么办？
        //判断是否用户已经参加了该活动，参加则返回用户已参加信息，没有则继续
        boolean isJoined = activityService.judgeJoined(activityId,validActivityList);
        if (isJoined){
            return Result.ok("用户已经参加该活动");
        }
        //根据用户当前所有有效活动日期去判断当前活动是否与其他活动时间有冲突

        //具体实现就是找到参加活动的开始结束时间，与用户名下有效活动开始结束时间去比较，得出是否能够参加
        boolean noTimeConflict =  activityService.ackJoinActivity(activityId,validActivityList);
        if(!noTimeConflict){
            return Result.fail("该时间段已有其他活动，请删除其中一个");
        }

        //参加该活动，需要向user_activity_role表中插入值
        //权限怎么设置
        //目前默认是参与者，也就是权限2,角色2
        //另外还有 活动id  用户id

        int count = activityService.insertUseUidAndAid(activityId);
        if(1 != count){
            return Result.fail("加入活动失败，请稍后再试");
        }

        return Result.ok("参加该活动成功");
    }

    //邀请用户参加活动
    //前端传入邀请用户的id,这里应该为数组
    @PostMapping("/inviteUser")
    public Result inviteUser(@RequestBody Map<String,Object> payload){
        List<Integer> ids = (List<Integer>) payload.get("ids");

    return Result.ok();


    }


    //输入活动id返回managerId

    @GetMapping("/managerIds")
    public Result returnManagerIds (@RequestParam("aid") int aid){

       List<Integer> ids  = activityService.findManagerIdsByAid(aid);

        return Result.ok(ids);

    }

    /**
     * 根据关键字
     *
     * @param keyword
     * @return
     */

    @GetMapping("/searchAct")
    public Result searchActInfo (@RequestParam("keyword") String keyword ){

       Activity activity =  activityService.searchActInfo(keyword);

        if(null == activity){
            return Result.fail("未查询到活动信息");
        }

       int role = activityService.findRole(activity.getId());

        Map<String,Object> map = new HashMap<>();
        map.put("role",role);
        map.put("activity",activity);
       return Result.ok(map);
    }


    /**
     *
     *
     * @param map
     * 1. 活动id
     * 2. 用户关键字,可以是id或名字
     * @return
     */

    @PostMapping("/setManager")
    public Result setManager(@RequestBody Map<String,Object> map ){
        int aid = (int) map.get("aid");
        String keyword = (String) map.get("keyword");

        int count =  activityService.setManager(aid,keyword);

      if (0 == count){

          return Result.fail("管理者设置失败，请检测输入的管理者id或昵称");
      }
      return Result.ok("设置成功");


    }

    /**
     *
     * 根据用户id和活动id删除管理者
     * @param map
     * @return
     */
    @PostMapping("/deleteManager")
    public Result deleteManager(@RequestBody Map<String,Object> map){

       int uid = (int) map.get("uid");
       int aid = (int) map.get("aid");

       int count = activityService.deleteManager(uid,aid);

       if (0 == count){
           return Result.fail("删除失败");
       }
       return Result.ok();

    }

    @GetMapping("/selectAll")
    public Result selectAll(@RequestParam("aid") int aid){

        List<UARDTO> userList =  activityService.selectAllUser(aid);
        for (UARDTO u:userList) {
            int uid = u.getUid();
            String name = userService.findNameById(uid);
            u.setName(name);
        }

        return Result.ok(userList);
    }



}
